﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Npgsql;
using Ortodoctor.Componentes;

namespace Ortodoctor.modelo
{
    class modeloIndicado : conexao
    {
        public modeloIndicado()
        {
            conn = new NpgsqlConnection(connectionstring);
            conn.Open();
        }

        public void insert(Indicado i)
        {
            try
            {
                if (conn.State.ToString()=="Closed"){
                    conn.Open();
                }
                String sql = "INSERT INTO indicado(id_cliente_indicado, id_cliente_indicou) " +
                             "VALUES (:p1, :p2)";
                NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                com.Parameters.AddWithValue("p1", i.cliente_indicado);
                com.Parameters.AddWithValue("p2", i.cliente_indicou);
                com.ExecuteNonQuery();
            }
            finally
            {
                conn.Close();
            }
        }

        public void insertOrUpdate(int id_indicado, int id_indicou)
        {
            //conn = new NpgsqlConnection(connectionstring);
            try
            {
                if (getIndicadoToUpdate(id_indicado))
                {
                    try
                    {
                        String sql = "UPDATE indicado set id_cliente_indicou=:p2, id_usuario_modificacao=:id_mod where id_cliente_indicado=:p1";
                        NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                        com.Parameters.AddWithValue("p1", id_indicado);
                        com.Parameters.AddWithValue("p2", id_indicou);
                        com.Parameters.AddWithValue("id_mod", System.Web.HttpContext.Current.Session["ID_USUARIO_ACESSO"].ToString());
                        com.ExecuteNonQuery();
                    }
                    catch
                    {
                        conn.Open();

                        String sql = "UPDATE indicado set id_cliente_indicou=:p2, id_usuario_modificacao=:id_mod where id_cliente_indicado=:p1";
                        NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                        com.Parameters.AddWithValue("p1", id_indicado);
                        com.Parameters.AddWithValue("p2", id_indicou);
                        com.Parameters.AddWithValue("id_mod", System.Web.HttpContext.Current.Session["ID_USUARIO_ACESSO"].ToString());
                        com.ExecuteNonQuery();
                    }
                }
                else
                {
                    try
                    {
                        String sql = "INSERT INTO indicado(id_cliente_indicado, id_cliente_indicou) " +
                                 "VALUES (:p1, :p2)";
                        NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                        com.Parameters.AddWithValue("p1", id_indicado);
                        com.Parameters.AddWithValue("p2", id_indicou);
                        com.ExecuteNonQuery();
                    }
                    catch
                    {

                        conn.Open();
                        String sql = "INSERT INTO indicado(id_cliente_indicado, id_cliente_indicou) " +
                                 "VALUES (:p1, :p2)";
                        NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                        com.Parameters.AddWithValue("p1", id_indicado);
                        com.Parameters.AddWithValue("p2", id_indicou);
                        com.ExecuteNonQuery();
                    }
                }
            }
            finally
            {
                conn.Close();
            }
        }

        public bool getIndicadoToUpdate(int id_cliente_indicado)
        {
            DataTable dt = new DataTable();
            try
            {
                //con.open();
                String sql = "SELECT * from indicado where id_cliente_indicado=" + id_cliente_indicado;
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn);
                da.Fill(dt);
            }
            finally { conn.Close(); }
            return (dt != null && dt.Rows.Count > 0);
        }

        public DataTable getAll(int id) //pegar todos os indicados de um cliente id=quem indicou
        {
            DataTable dt = new DataTable();
            try
            {
                //con.open();
                String sql = "SELECT c.*, i.* FROM indicado as i, cliente as c WHERE " +
                         "i_id_cliente_indicou=c.id_cliente";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn);
                da.Fill(dt);
            }
            finally { conn.Close(); }
            return dt;
        }

        public DataTable getAll2(int id) //pegar todos os caras que ja indicaram alguem
        {
            DataTable dt = new DataTable();
            try
            {
                //con.open();
                String sql = "SELECT * FROM indicado";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn);
                da.Fill(dt);
            }
            finally
            {
                conn.Close();
            }
            return dt;
        }

        public int getNumIndicados(int id_indicou)
        {
            DataTable dt = new DataTable();
            try
            {
                //con.open();
                String sql = "select count(*) as count from indicado where id_cliente_indicou = " + id_indicou;
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn);
                da.Fill(dt);
            }
            finally
            {
                conn.Close();
            }
            return dt != null && dt.Rows.Count > 0 ? Convert.ToInt32(dt.Rows[0]["count"]) : 0;
        }

        public DataTable getIndicado(int id) //pegar indicado pelo id dele
        {
            DataTable dt = new DataTable();
            try
            {
                //con.open();
                String sql = "SELECT * FROM indicado WHERE id_indicado=:id";
                NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                com.Parameters.AddWithValue("id", id);
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn);
                da.Fill(dt);
            }
            finally { conn.Close(); }
            return dt;
        }

        public void delete(int id)
        {
            try
            {
                //con.open();
                String sql = "DELETE FROM indicado WHERE id_indicado=:id";
                NpgsqlCommand com = new NpgsqlCommand(sql, conn);
                com.Parameters.AddWithValue("id", id);
                com.ExecuteNonQuery();

                sql = "update indicado_hist set id_usuario_modificacao = :id_mod, data_modificacao=:data where id_indicado = :id";
                com = new NpgsqlCommand(sql, conn);
                com.Parameters.AddWithValue("id", id);
                com.Parameters.AddWithValue("data", DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss"));
                com.Parameters.AddWithValue("id_mod", System.Web.HttpContext.Current.Session["ID_USUARIO_ACESSO"].ToString());
                com.ExecuteNonQuery();
            }
            finally { conn.Close(); }
        }

        public DataTable getParcelasIndicados(int id_indicou)
        {
            DataTable dt = new DataTable();
            try
            {
                //con.open();
                String sql = @"with data_venc as (
	                                select 
		                                id_cliente,
		                                id_procedimento, 
		                                min(data_vencimento) as data_vencimento 
	                                from parcelas inner join procedimento_cliente 
		                                using(id_procedimento_cliente)where id_cliente in 
					                            (select 
					                                id_cliente_indicado 
					                             from indicado where 
					                                id_cliente_indicou = " + id_indicou + @") group by id_cliente, id_procedimento)

                                select 
	                                data_venc.data_vencimento, 
	                                status, 
	                                data_venc.id_cliente, 
	                                data_venc.id_procedimento
                                from parcelas inner join procedimento_cliente 
	                               using(id_procedimento_cliente) inner join data_venc 
	                               on procedimento_cliente.id_cliente = data_venc.id_cliente
	                              and procedimento_cliente.id_procedimento = data_venc.id_procedimento

	                               inner join procedimento on procedimento_cliente.id_procedimento = procedimento.id_procedimento
                                where data_venc.id_cliente in 
	                            (select 
		                            id_cliente_indicado 
	                             from indicado 
		                            where id_cliente_indicou = " + id_indicou + @") and procedimento.promocao = 'Sim'
	                                order by id_cliente, parcelas.data_vencimento";

                   /* @"SELECT data_vencimento, 
                             status, 
                             id_cliente, 
                             id_procedimento
       
                    FROM procedimento_cliente INNER JOIN 
                        parcelas USING ( id_procedimento_cliente )
                    WHERE id_cliente in (SELECT id_cliente_indicado FROM 
                    indicado WHERE id_cliente_indicou = " + id_indicou + @") 
                    ORDER BY id_cliente, id_procedimento, data_vencimento
                                 
                               ";*/
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn);
                da.Fill(dt);
            }
            finally
            {
                conn.Close();
            }
            return dt;
        }

        public DateTime getDataIndicador(int id_indicou)
        {
            DataTable dt = new DataTable();
            try
            {
                //con.open();
                String sql = @"select min(data_vencimento) as data from parcelas inner join procedimento_cliente using(id_procedimento_cliente) where id_cliente = " + id_indicou;
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn);
                da.Fill(dt);
            }
            finally
            {
                conn.Close();
            }
            if (dt != null)
                return Convert.ToDateTime(dt.Rows[0]["data"]);
            return new DateTime();
        }

        public DateTime getDataIndicadorWithNoTratement(int id_indicou)
        {
            DataTable dt = new DataTable();
            try
            {
                //con.open();
                String sql = @"select min(data_vencimento) as data from parcelas inner join procedimento_cliente using(id_procedimento_cliente) 
where id_cliente in (select id_cliente_indicado from indicado where id_cliente_indicou = " + id_indicou + ") ";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn);
                da.Fill(dt);
            }
            finally
            {
                conn.Close();
            }
            if (dt != null)
                return Convert.ToDateTime(dt.Rows[0]["data"]);
            return new DateTime();

        }

        public DataTable getIndicados(int id_indicou, int id_clinica, string data_inicial, string data_final)
        {
            DataTable dt = new DataTable();
            try
            {
                //con.open();
                String sql = string.Format(@" SELECT 
                                      C1.NOME AS ""Indicado"",
                                      C2.NOME AS ""Indicou"",
                                      CAST(C1.DATA_CADASTRO AS VARCHAR) AS ""Indicação"",
                                      P1.NOME_PROCEDIMENTO AS ""Faz Tratamento?""
                                FROM INDICADO I INNER JOIN 
                                      CLIENTE C1 ON C1.ID_CLIENTE = I.ID_CLIENTE_INDICADO INNER JOIN
                                      CLIENTE C2 ON C2.ID_CLIENTE = I.ID_CLIENTE_INDICOU LEFT JOIN 
                                      PROCEDIMENTO_CLIENTE P ON C1.ID_CLIENTE = P.ID_CLIENTE LEFT JOIN
                                      PROCEDIMENTO P1 ON P.ID_PROCEDIMENTO = P1.ID_PROCEDIMENTO
                                WHERE " + (string.IsNullOrEmpty(data_inicial) ? "" : 
                                        "C1.DATA_CADASTRO BETWEEN '" + Convert.ToDateTime(data_inicial).ToString("MM/dd/yyyy") + 
                                                            "' AND '" + Convert.ToDateTime(data_final).ToString("MM/dd/yyyy") + "' AND ") +
                                    @"(C1.ID_CLINICA = {0} OR C1.ID_CLINICA = {0} OR -999 = {0}) AND 
                                      (C2.ID_CLIENTE = {1} OR C2.ID_CLIENTE = {1} OR -999 = {1}) ORDER BY C1.DATA_CADASTRO", id_clinica, id_indicou);
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, conn);
                da.Fill(dt);

                foreach (DataRow dr in dt.Rows)
                    dr["Indicação"] = Convert.ToDateTime(dr["Indicação"]).ToString("dd/MM/yyyy");
            }
            finally
            {
                conn.Close();
            }
            return dt;
        }
    }
}
